package com.hulk.dryad.admin.security.service;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.hulk.dryad.common.component.DryadUser;
import com.hulk.dryad.common.constant.enums.RootFlag;
import lombok.Getter;

import lombok.ToString;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.SpringSecurityCoreVersion;

import java.util.Collection;

/**
 * @author hulk
 * @date 2020/4/16 扩展用户信息
 */
public class AdminUser extends DryadUser {

	private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;

	/**
	 * 头像
	 */
	@Getter
	@ToString.Exclude
	private String avatar;
	/**
	 * 超级管理员标识
	 */
	@Getter
	private String rootFlag;
	/**
	 * 手机号
	 */
	@Getter
	private String phone;

	/**
	 * 岗位集合
	 */
	@Getter
	private Long[] postIds;
	
	/**
	 * 占位符TOTP
	 */
	@Getter
	private String totp;

	/**
	 * Construct the <code>User</code> with the details required by {@link DaoAuthenticationProvider}.
	 *
	 * @param id                    用户ID
	 * @param deptId                部门ID
	 * @param username              the username presented to the <code>DaoAuthenticationProvider</code>
	 * @param password              the password that should be presented to the <code>DaoAuthenticationProvider
	 *                              </code>
	 * @param enabled               set to <code>true</code> if the user is enabled
	 * @param accountNonExpired     set to <code>true</code> if the account has not expired
	 * @param credentialsNonExpired set to <code>true</code> if the credentials have not expired
	 * @param accountNonLocked      set to <code>true</code> if the account is not locked
	 * @param authorities           the authorities that should be granted to the caller if they presented the
	 *                              correct username and password and the user is enabled. Not null.
	 * @throws IllegalArgumentException if a <code>null</code> value was passed either as a parameter
	 *                                  or as an element in the <code>GrantedAuthority</code> collection
	 */
	@JsonCreator
	public AdminUser(
			@JsonProperty("id")Long id,
			@JsonProperty("deptId")Integer deptId,
			@JsonProperty("phone")String phone,
			@JsonProperty("avatar")String avatar,
			@JsonProperty("postIds")Long[] postIds,
			@JsonProperty("tenantId")String tenantId,
			@JsonProperty("rootFlag")String rootFlag,
			@JsonProperty("totp")String totp,
			@JsonProperty("username")String username,
			@JsonProperty("password")String password,
			@JsonProperty("enabled")boolean enabled,
			@JsonProperty("accountNonExpired")boolean accountNonExpired,
			@JsonProperty("credentialsNonExpired")boolean credentialsNonExpired,
			@JsonProperty("accountNonLocked")boolean accountNonLocked,
			@JsonProperty("authorities")Collection<? extends GrantedAuthority> authorities) {
		super(
				id,
				deptId,
				tenantId,
				username,
				password,
				enabled,
				accountNonExpired,
				credentialsNonExpired,
				accountNonLocked,
				authorities);
		this.phone = phone;
		this.rootFlag = rootFlag;
		this.avatar = avatar;
		this.postIds = postIds;
		this.totp = totp;
	}

	public boolean isRoot() {
		return RootFlag.ROOT.getValue().equals(rootFlag);
	}
}
